Cyclone DDS 代理模型:发现协议与状态镜像
DDS 的发布订阅建立在「发现」之上:通信双方先互相知道对方的存在和端点,再谈数据收发。但发现本身是异步的,网络延迟、丢包、多播时序都会让两边进入「一方已发现另一方、反向还没完成」的中间态。本文介绍 Eclipse Cyclone DDS 用代理(Proxy)机制管理这种不确定性的方式:本地只为已确认的远程实体建立镜像,所有匹配、收发与资源回收都围绕镜像进行。适合在选型或排查 DDS 通信问题时想理解其内部模型的读者。
发现协议与不对称问题
DDSI/RTPS 的发现分两层协议:
- SPDP(Simple Participant Discovery Protocol):发现远程参与者(Participant)。
- SEDP(Simple Endpoint Discovery Protocol):发现远程端点(Writer/Reader)。
两层各自独立、异步进行,于是很容易出现不对称发现(Asymmetric Discovery)——一方完成了对另一方的发现,反向还没有完成:
如果实现不对这个中间态做约束,会带来两类问题:
- 数据交付风险:数据可能发给未经完整匹配验证的端点,带宽浪费之外,接收方也无法确认来源经过了 QoS 校验。
- 通信阻塞风险:读取者认为写入者存在并等待数据,写入者认为读取者不存在而从不发送,应用层的等待可能无限期挂起。
代理模型:本地状态镜像
Cyclone DDS 的做法是给每一个发现的远程实体在本地内存建一个代理对象,作为该实体的本地镜像,参与所有后续的匹配计算、状态管理与传输控制:
- Proxy Participant:远程参与者的镜像。
- Proxy Writer / Proxy Reader:远程端点的镜像。
通信由此被两条硬性规则约束:
- 本地 Writer 只向已建立 Proxy Reader 的远程端点发送数据。
- 本地 Reader 只接收来自已建立 Proxy Writer 的远程端点的数据。
只有双向发现都完成(双方都建立了对方实体的代理)并且匹配检查通过,数据通道才真正激活。「看得见」与「能通信」是两个不同的门槛,代理模型把两者拆开了。
匹配流程
代理的创建遵循严格的层级逻辑:
- 参与者发现:收到远程节点的 SPDP 消息,创建 Proxy Participant,并启动租约计时。
- 端点发现:收到 SEDP 消息,在对应 Proxy Participant 下创建 Proxy Writer 或 Proxy Reader。
- 匹配检查:检查本地端点与代理是否满足匹配条件——主题名称、类型名称、QoS 设置三者都要一致。匹配失败的代理只是存在,不产生通信。
以「B 发现了 A 的 Writer、A 还没发现 B 的 Reader」为例,时序上依次是:
Writer 在代理缺失时主动抑制发送,从机制上消除了「一端等待、另一端沉默」的死锁窗口。
多播例外
单播路径执行上述白名单机制。多播是官方明确允许的例外:Writer 可以选择把数据发到多播组,此时读取者即使已经发现写入者、而写入者尚未发现自己,也能收到数据——这是代理模型下被认可的单侧接收路径。代价是不享受可靠性的完整保障(如重传配合),多播定位是可选的优化手段,不改变连接状态管理的核心逻辑。
生命周期:租约与级联清理
代理采用层级化管理:代理端点归属于代理参与者,资源回收由此有两个层次:
Proxy Participant(根)
├── Proxy Writer 1
├── Proxy Writer 2
└── Proxy Reader 1 | 触发事件 | 行为 | 影响范围 |
|---|---|---|
| SEDP Dispose/Unregister | 删除特定代理端点 | 仅该 Proxy Writer/Reader |
| 租约超时(Lease Duration) | 判定远程参与者失联 | 级联删除 Proxy Participant 及其全部子端点 |
| 参与者显式下线 | 立即清理,不等超时 | 相关代理资源全部回收 |
租约时长由参与者在 SPDP 消息中声明,远程节点周期性发送 SPDP 续租;超时未续即触发级联清理,防止失联节点的代理在内存里无限累积。
与无代理实现的对比
| 维度 | 无代理/弱状态实现 | Cyclone DDS 代理模型 |
|---|---|---|
| 连接建立条件 | 单侧发现即可尝试通信 | 双侧代理建立后方可通信 |
| 数据来源校验 | 可能接收未验证来源的数据 | 仅处理来自已知代理的数据 |
| 阻塞风险 | 半连接状态易无限等待 | 代理缺失时抑制收发,避免死锁 |
| 资源回收 | 依赖全局超时,清理滞后 | 层级级联删除 + 租约机制 |
| 匹配严谨性 | 存在误匹配空间 | Topic + Type + QoS 三重校验 |
总结
Cyclone DDS 的代理模型,本质是把分布式的异步发现过程收敛为本地确定性的状态机:远程实体先以代理形式落地,再经过三重匹配升级为可通信的连接,最后由租约与级联删除管理退场。对使用者来说,这个模型解释了两类常见现象——为什么短暂的网络分区恢复后通信能自动续上(租约内代理仍在),以及为什么端点创建后数据不会立即流动(要等双向发现与匹配完成)。